编译器如何填充值char array[100] = {0};
?它背后的魔力是什么?
我想知道内部编译器如何初始化.
这不是魔术.
C规范的第6.7.8.21节(C规范的在线草案)中描述了C中此代码的行为:对于没有指定值的元素,编译器将指针初始化为NULL,将算术类型初始化为零(并递归地将其应用于聚合).
C++中的代码行为在C++规范的8.5.1.7节(C++规范的在线草案)中描述:编译器聚合初始化没有指定值的元素.
另请注意,在C++(但不是C)中,您可以使用空的初始化列表,从而使编译器聚合初始化数组的所有元素:
char array[100] = {};
至于编译器在执行此操作时可能生成的代码类型,请查看以下问题:数组0初始化的奇怪组件
实现取决于编译器开发人员.
如果您的问题是"这种声明会发生什么" - 编译器会将第一个数组元素设置为您提供的值(0),其他所有数组元素将设置为零,因为它是省略的数组元素的默认值.
如果您的编译器是GCC,您还可以使用以下语法:
int array[256] = {[0 ... 255] = 0};
请查看 http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Designated-Inits.html#Designated-Inits,并注意这是一个特定于编译器的功能.
这取决于你进行初始化的地方.
如果数组是静态的,如
char array[100] = {0}; int main(void) { ... }
然后是编译器在程序的数据段中保留100 0字节.在这种情况下,您可以省略初始化器.
如果您的阵列是自动的,那么这是另一个故事.
int foo(void) { char array[100] = {0}; ... }
在这种情况下,每次调用函数foo时,你都会有一个隐藏的memset.
上面的代码相当于
int foo(void) { char array[100]; memset(array, 0, sizeof(array)); .... }
如果省略初始化程序,则数组将包含随机数据(堆栈数据).
如果您的本地数组声明为静态,如
int foo(void) { static char array[100] = {0}; ... }
那么它在技术上与第一个相同.